
from dash.dependencies import Input, Output
from dash import Dash, dcc, html,callback
import dash_bootstrap_components as dbc
import asyncio
import json
from tqdm import tqdm
from revChatGPT.V1 import AsyncChatbot
from revChatGPT.V1 import Chatbot
from .. import navi
import time
config = {
    "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ik1UaEVOVUpHTkVNMVFURTRNMEZCTWpkQ05UZzVNRFUxUlRVd1FVSkRNRU13UmtGRVFrRXpSZyJ9.eyJodHRwczovL2FwaS5vcGVuYWkuY29tL3Byb2ZpbGUiOnsiZW1haWwiOiJib29sMDFtYXN0ZXJAZ21haWwuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWV9LCJodHRwczovL2FwaS5vcGVuYWkuY29tL2F1dGgiOnsidXNlcl9pZCI6InVzZXItWHdnNDgyNzBJeXgwcUZGbXM2eG9lMHdjIn0sImlzcyI6Imh0dHBzOi8vYXV0aDAub3BlbmFpLmNvbS8iLCJzdWIiOiJnb29nbGUtb2F1dGgyfDEwNDM1NTA3MTUzNzM5NjI1NjQ5MyIsImF1ZCI6WyJodHRwczovL2FwaS5vcGVuYWkuY29tL3YxIiwiaHR0cHM6Ly9vcGVuYWkub3BlbmFpLmF1dGgwYXBwLmNvbS91c2VyaW5mbyJdLCJpYXQiOjE2OTE4MTY4MzYsImV4cCI6MTY5MzAyNjQzNiwiYXpwIjoiVGRKSWNiZTE2V29USHROOTVueXl3aDVFNHlPbzZJdEciLCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG1vZGVsLnJlYWQgbW9kZWwucmVxdWVzdCBvcmdhbml6YXRpb24ucmVhZCBvcmdhbml6YXRpb24ud3JpdGUgb2ZmbGluZV9hY2Nlc3MifQ.e_DDtqy7eQpXGrprjSoMG7SsgdWE0ZmFWfxxak6I0_C8BH6PH6UzmblAd13OlgN9FHRUPEj-OcoUlVOG2CxYZHVnS0pvlHZWygEPjbvhoeFrHsYJ5Qwg7-NcDcHWUw189VRviA5MQAkcmF8vWMM2JXm_OsCRtnAl90B9pHWA5q0OeZwtMCEjPJPB3Qzgulo4OwInjsvHYSbAvLYFP9DGk_sZ8xec9wa1A4DyIItap-74U-KgvPnSC4yyUaRqo1fZA5EmagsjXPJTbyOgrVY4mpR2T9AJ0HTzmo8FJfFKwa1Yw6UYjavdnA0QSWIwfaL8ceeGVsYcgurtI_7ckmkTCw",
#   "proxy": 'http://127.0.0.1:7890'
}

async def main():
    chatbot = AsyncChatbot(config)
    async for message in chatbot.ask("Hello, how are you?"):
        print(message.get("message"))

    print(await chatbot.share_conversation())


def sync_main():
    chatbot = Chatbot(config)
    for message in chatbot.ask("""
                               丁元英是这样一个人: 中等身材，略显显瘦，穿一套深灰色西装，严肃的神态中显露出几分憔悴…1978年考入清华大学，留学柏林获得经济学硕士…”在别人眼中的丁元英呢。他的助理肖亚文曾评价他“我没见过这样的人，或者说他根本就不是人…是魔是鬼都可以。他跟正常人的思维颠倒，说鬼话，办鬼事儿，倒行逆施但还有道理”后面内容还大量介绍到他的特点，比如居高临下对世俗的包容，在五台山与主持谈经论道，以及对强势文化、弱势文化的理解…书中肖亚文从自身的角度来理解丁元英，有一段话概括的特别好“认识这个人就是开了一扇窗户，就能看到不一样的东西，听到不一样的声音，能让你思考、觉悟…”这里再提一下里面特别有哲理的台词吧，这一方面也衬托除了丁元英的过人之处（其实是作者豆豆的过人之处）：1、一个恕字我已经有罪了。2.这是文化属性，不以他们的意志为转移。3.我们这个民族总是以有文化自居，却忘了问一句，是有什么文化，是真理真相的文化，还是弱势文化；是符合事物规律的文化，还是违背事物规律的文化，归根到底都是那种文化属性的产物，不以人的意志为转移。4.马克思主义的道理归根到底一句话，客观规律不以人的意志为转移，什么是客观规律，归根到底也是一句话：一切以时间、地点和条件为转移。    5.中国的传统文化是皇恩浩荡的文化，他的使用是以皇天在上为先决条件。中国为什么穷，穷就穷在幼稚的思维，穷在期望救主，期望救恩的文化上，这是一个渗透到民族骨子里的价值判断体系。太可怕了！  7.透视社会依次有三个层面： 技术、 制度、和文化。小到一个人，大到一个国家、一个民族，任何一种命运归根到底都是那种文化属性的产物。强势文化造就强者，弱势文化造就弱者，这是规律。也可以理解为天道，不以人的意志为转移。  8.强势文化就是遵循事物规律的文化，弱势文化就是依赖强者的道德期望破格获取的文化，也是期望救主的文化。强势文化在武学上被称为秘笈，而弱势文化由于易学、易懂、易用、成了流行品种。  9.没有主，主义，主意从哪儿来？主无处不在，简单地说，支配人的价值取舍行为的那东西就是主，就是文化属性  10.如果一个民族的文化从骨子里就是弱势文化属性，怎么可能去承载强势文化的政治、经济？衡量一种文化属性不是看他的积淀的时间长短，而是看他与客观规律的距离。五千年的文化是光辉，是灿烂。这个没有问题。但是，传统和习俗得过过客观规律的筛子11.我还没有装腔作势到可以无视可能发生的事情，但是你看到的东西不一定是个东西。天知，地知，不会有结果。  12.女人是形式逻辑的典范，是辩证逻辑的障碍，我无意摧残女人，也不想被女人摧残。  13.红颜知己自古有之，这还得看男人是不是一杯好酒，自古又有几个男人能把自己酿到淡而又淡的名贵，这不是为之而可为的事，能混就混吧。    14.你是一块玉，但我不是匠人，我不过是一个略懂投机之道的混子。充其量能挣几个打发凡夫俗子的铜板，你要求的是一种雄性文化的魂，我不能因为你没有说出来而装作不知道。接受你就接受了一种高度，而我没有这个自信。15.神即道，道法自然， 如来。16.悟——悟道休言天命，修行勿取真经。一悲一喜一枯荣，哪个前生注定。袈裟本无清静，红尘不染性空。幽幽古刹千年钟，都是痴人说梦。17.所谓真经，就是能够达到寂空涅盘的究竟法门，可悟不可修。修为成佛，在求；悟为明性，在知。修行以行制性；悟道以性施行。觉者由心生律；修者以律制心。有信无证者虽不落恶果，却住因住果，住念住心，如是生灭，不得涅盘。佛乃觉性，非人。人人都有觉性不等于觉性就是人。人相可坏，觉性无生无灭。即觉即显，即障即尘蔽。无障不显，了障涅盘。觉行圆满之佛，乃佛教人相之佛。圆满即止，即非无量，若佛有量，即非阿弥陀佛。佛法无量即觉行无量。无圆无不圆，无满无不满。亦无是名，究竟圆满。佛教若以次第而分，从精深处说是得到天成的道法。道法如来不可思议，即非文化。从浅义处说是导人向善的教义。善恶本有人相、我相、众生相，即是文化。从众生处说是以贪制贪，以幻制幻的善巧。虽不灭败坏下流，却无碍抚慰灵魂的慈悲。
                               你现在需要模仿丁元英的方式回答问题，对于我的每个问题你都需要以丁元英的方式回答我
                               """):
        response = message.get("message")
    # print(response)
    return chatbot

# asyncio.run(main())
chatbot = sync_main()

def get_answer(chatbot,question):
    for message in tqdm(chatbot.ask(question)):
        response = message.get("message")
    
    return response


# get_answer(chatbot,"我想请问丁先生，你经营的私募基金在业绩最好的状态下终止合作，是否受到了外力作用？")

## 采用dash 搭建一个问答系统的界面 
## 问题框固定在底部，回答框固定在顶部
def askBox():
    return html.Div([
        dbc.Row([
            dbc.Col([
                dbc.Input(id='askInput',placeholder='请输入问题询问丁元英',style={'width':'100%'})
            ],style={'margin-right':'10px','width':'70%'}),
            dbc.Col([
                dbc.Button('提问',id='askButton',color='primary',style={'width':'100%'})
            ],style={'width':'20%'})
        ],className='my-3',style={'width':'100%','display':'flex','justify-content':'center','align-items':'center','height':'50px'})
    ],style={'position':'fixed','bottom':'0px','width':'100%','background-color':'#fff','padding':'10px','z-index':'100'})


def answerBox():
    return html.Div([
        html.H4('来自虚拟丁元英的回答:', className='MovieIntro'),
        html.Hr(),
        dbc.Row([
            ## 用一个可以变动长度的进度条表示回答的进度
            # html.Div([
            #         dbc.Progress(id='progress',value=0,style={'height':'20px','width':'90%','margin':'0px 10px'}),
            #         html.span(id='progressText',className='text-secondary',style={'margin':'0px 10px','width':'10%'})
            #     ],className='MovieStarDiv',style={'margin-top':'10px','width':'100%','display':'flex','justify-content':'left'}),
            dbc.Col([
                dcc.Loading(
                    html.P(id='answer',className='text-secondary'),
                    id="loading-answer",
                    type="circle",
                )
            ],style={'margin-right':'10px','width':'70%'}),
        ],className='my-3',style={'width':'100%','display':'flex','justify-content':'center','align-items':'center'})
    ])

@callback(
    [Output('askInput','value'),
    Output('answer','children')],
    [Input('askButton','n_clicks'),
    Input('askInput','value')]
)
def ask(n_clicks,value):
    if n_clicks:
        time.sleep(2)
        if value is None or value == '':
            return ['','你还没有输入问题哦']
        return ['',get_answer(chatbot,value)]
    

def Chat():
    return html.Div([
        navi.navigator(),
        askBox(),
        answerBox()
    ],style={'margin':'20px'})